package com.wl.dzt.sys.core.dao.curd;


import com.wl.dzt.sys.util.FieldUtil;
import com.wl.dzt.sys.util.clazz.ClassUtil;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author wl_code@163.com
 * @version 1.0
 * @date 2018/7/5/005
 * @description 数据级联工具类
 * 该类用于封装orm方式的对象适配和查找
 */
public class CrudCascade {

    /**
     * <b>获取级联字段 </b>
     * <p>
     * 根据实体获取其所有存在的级联对象
     * </p>
     *
     * @param entity
     * @return
     */
    public static List<Object> cascadeField(Object entity) {
        List<Object> list = new ArrayList<>();
        cascadeField(list, entity);
        Collections.reverse(list);
        return list;
    }

    /**
     * <b>递归级联字段</b>
     * <p>
     * 根据实体和容器递归查找实体的级联对象
     * </p>
     *
     * @param list
     * @param entity
     */
    private static void cascadeField(List<Object> list, Object entity) {
        Field[] fs = entity.getClass().getDeclaredFields();
        Arrays.stream(fs).forEach(field -> {
            if (!ClassUtil.isBaseValType(field.getType())) {
                Object o = FieldUtil.doGetMethod(entity, field.getName());
                if (o != null) {
                    list.add(o);
                    cascadeField(list, o);
                }
            }
        });
    }

}
